﻿Imports System.IO
Imports Commander_Wars.Spieletools
<Serializable()> Public Class ObjektScript
#Region "Allgemein"
    Enum Prüfstadien
        RundenAnfang
        RundenMitte
        RundenEnde
    End Enum
    Public Shared Scripts() As ObjektScript = {}
    Public Shared Variablen As New List(Of GebäudeFabrik.Variable)

    ''' <summary>
    ''' Löscht alle vorhandenen Scripte.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Reset()
        Array.Resize(Scripts, 0)
        Variablen.Clear()
    End Sub

    ''' <summary>
    ''' Löscht alle vorhandenen Scripte und lädt ein neues.
    ''' </summary>
    ''' <param name="Scriptname">Wie das Script heißt, welches verwendet werden soll. die vorangegangenen Ordner interessieren nicht, die weiß ich selber. Das .script am Ende kannst du dir sparen wenn du willst, musst du aber im Gegensatz zu den Ordnern mit Ressourcenpfad und so nicht</param>
    ''' <remarks></remarks>
    Public Shared Sub NeuScript(ByVal Scriptname As String)
        Reset()
        DialogTextSprachKonverter.Reset()
        addScript(Scriptname)
    End Sub

    ''' <summary>
    ''' Lädt ein neues Script, ohne die alten wegzuschmeisen
    ''' </summary>
    ''' <param name="Scriptname">Wie das Script heißt, welches verwendet werden soll. die vorangegangenen Ordner interessieren nicht, die weiß ich selber. Das .script am Ende kannst du dir sparen wenn du willst, musst du aber im Gegensatz zu den Ordnern mit Ressourcenpfad und so nicht</param>
    ''' <remarks></remarks>
    Public Shared Sub addScript(ByVal Scriptname As String)
        If Not Scriptname.EndsWith(".script") Then Scriptname += ".script"
        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Scripts\" + Scriptname) Then
            Dim strR As New StreamReader(My.Settings.Resourcenpfad + "Scripts\" + Scriptname, System.Text.Encoding.Default)
            Dim NeuScript As New ObjektScript
            While Not strR.EndOfStream 'Kann man alternativ natürlich auch mit einem serializble oder so machen, allerdings kann ich das nicht.
                'Tja was jetzt kommt ist noch nicht so genau festgelegt.
                Dim z As String = strR.ReadLine
                z = z.Trim
                If z = "" Then Continue While 'Leerzeilen bergen keine Informationen.
                If z.StartsWith("'") Then Continue While 'Komentare schon, sind aber für uns (jetzt) nicht weiter wichtig :)
                If z.ToLower.StartsWith("newvariable:") Then
                    Dim S() As String = z.Remove(0, z.IndexOf(":") + 1).Split("|")
                    Variablen.Add(New GebäudeFabrik.Variable(S(0), S(1)))
                    Continue While
                End If

                If z.StartsWith("###") Then
                    NeuScript = New ObjektScript
                    Continue While
                End If
                'Auslöser:
                If z.StartsWith("Tag:") Then
                    z = z.Remove(0, 4)
                    Dim s() As String = z.Split("|")
                    NeuScript.addBedingungTag(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("Tag>") Then
                    z = z.Remove(0, 4)
                    Dim s() As String = z.Split("|")
                    NeuScript.addBedingungTagGrößer(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("Tag<") Then
                    z = z.Remove(0, 4)
                    Dim s() As String = z.Split("|")
                    NeuScript.addBedingungTagKleiner(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("Tag*") Then
                    z = z.Remove(0, 4)
                    Dim s() As String = z.Split("|")
                    NeuScript.addBedingungJedenXTag(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("Besetzt:") Then
                    z = z.Remove(0, 8)
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        NeuScript.addBedingungBesetzt(s(0), s(1), s(2), s(3))
                    Else
                        NeuScript.addBedingungBesetzt(s(0), s(1), s(2))
                    End If
                    Continue While
                End If
                If z.StartsWith("Sieg:") Then
                    z = z.Remove(0, 5)
                    NeuScript.addBedingungSieg(z)
                    Continue While
                End If
                If z.StartsWith("Feuerladung:") Then
                    z = z.Remove(0, 12)
                    Dim s As String() = z.Split("|")
                    If s.Length > 3 Then
                        NeuScript.addBedingungFeuerbereit(s(0), s(1), s(3), s(2))
                    Else
                        NeuScript.addBedingungFeuerbereit(s(0), s(1), s(2), )
                    End If
                    Continue While
                End If
                If z.StartsWith("NachXZügenImmer:") Then
                    z = z.Remove(0, 16)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungNachXZügenImmer(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("LandkartenZustand:") Then
                    z = z.Remove(0, 18)
                    Dim s As String() = z.Split("|")
                    Dim Zustand As Mission.MissionsZustände = CInt(s(1))
                    NeuScript.addBedingungLandkarteZustand(s(0), Zustand)
                    Continue While
                End If
                If z.StartsWith("CountLandkarteZustand:") Then
                    z = z.Remove(0, 22)
                    Dim s As String() = z.Split("|")
                    Dim Zustand As Mission.MissionsZustände = CInt(s(3))
                    NeuScript.addBedingungCountLandkarteZustand(s(0), s(1), s(2), Zustand)
                    Continue While
                End If
                If z.StartsWith("GebäudeZerstört:") Then
                    z = z.Remove(0, 16)
                    Dim s As String() = z.Split("|")
                    If s.Length > 2 Then
                        NeuScript.addBedingungGebäudeZerstört(s(0), s(1), s(2))
                    Else
                        NeuScript.addBedingungGebäudeZerstört(s(0), s(1))
                    End If

                    Continue While
                End If
                If z.ToLower.StartsWith("spielerbesiegt:") Then
                    z = z.Remove(0, 15)
                    NeuScript.addBedingungSpielerBesiegt(z)
                End If
                If z.ToLower.StartsWith("inbereich:") Then
                    z = z.Remove(0, 10)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungInBereich(New Point(s(0), s(1)), New Point(s(2), s(3)), s(4), s(5))
                End If
                If z.ToLower.StartsWith("einheitzerstört:") Then
                    z = z.Remove(0, 16)
                    Dim s As String() = z.Split("|")
                    If s.Length > 2 Then
                        NeuScript.addBedingungEinheitZerstört(s(0), s(1), s(2))
                    Else
                        NeuScript.addBedingungEinheitZerstört(s(0), s(1))
                    End If
                End If
                If z.ToLower.StartsWith("feldleer:") Then
                    z = z.Remove(0, 9)
                    Dim s As String() = z.Split("|")
                    If s.Length > 2 Then
                        NeuScript.addBedingungFeldLeer(s(0), s(1), s(2))
                    Else
                        NeuScript.addBedingungFeldLeer(s(0), s(1))
                    End If
                End If
                If z.ToLower.StartsWith("zufall:") Then
                    z = z.Remove(0, 7)
                    NeuScript.addBedingungZufall(z)
                End If
                If z.ToLower.StartsWith("variablegleich:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungVariableIstGleich(s(0), s(1))
                End If
                If z.ToLower.StartsWith("variablekleiner:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungVariableKleiner(s(0), s(1))
                End If
                If z.ToLower.StartsWith("variablegrößer:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungVariableGrößer(s(0), s(1))
                End If
                If z.ToLower.StartsWith("variablegrößergleich:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s As String() = z.Split("|")
                    NeuScript.addBedingungVariableGrößerGleich(s(0), s(1))
                End If

                'Ereignisse:
                If z.StartsWith("Dialog:") Then
                    z = z.Remove(0, 7)
                    Dim s() As String = z.Split("|")
                    Dim Chat As String = ""
                    For i = 3 To s.Length - 2
                        Chat += s(i) + "|"
                    Next
                    Chat += s(s.Length - 1)
                    NeuScript.addEreignisDialog(Chat, s(0), s(1), CInt(s(2)))
                    Continue While
                End If
                If z.ToLower.StartsWith("Dialog2:".ToLower) Then
                    z = z.Remove(0, 8)
                    Dim s() As String = z.Split("|")
                    Dim Chat As String = ""
                    For i = 5 To s.Length - 2
                        Chat += s(i) + "|"
                    Next
                    Chat += s(s.Length - 1)
                    NeuScript.addEreignisDialog(Chat, s(0), s(1), CInt(s(2)), s(3), s(4))
                    Continue While
                End If
                If z.Trim.StartsWith("%") Then
                    'hm.. eine Sprach...
                    Dim s() As String = z.Split("%")
                    DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                End If
                If z.StartsWith("EinheitE:") Then
                    z = z.Remove(0, 9)
                    Dim s() As String = z.Split("|")
                    If s.Length > 6 Then
                        NeuScript.addEreignisEinheitErschaffen(s(0), s(1), s(2), s(3), s(4), s(5), s(6))
                    Else
                        NeuScript.addEreignisEinheitErschaffen(s(0), s(1), s(2), s(3), s(4), s(5))
                    End If
                    Continue While
                End If
                If z.StartsWith("SetKP:") Then
                    z = z.Remove(0, 6)
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        NeuScript.addEreignisSetKP(s(0), s(1), s(2), s(3))
                    Else
                        NeuScript.addEreignisSetKP(s(0), s(1), s(2))
                    End If
                    Continue While
                End If
                If z.StartsWith("SetKO:") Then
                    z = z.Remove(0, 6)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisSetKO(s(0), s(1), s(2))
                    Continue While
                End If
                If z.StartsWith("Schadenswelle:") Then
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisSchadenswelle(s(0), s(1))
                    Continue While
                End If
                If z.ToLower.StartsWith("landkarte|") Then
                    Dim s() As String = z.Split("|")
                    Select Case s(1).ToLower
                        Case "mgewonnen"
                            NeuScript.addEreignisLandkarteMGewonnen(s(2))
                        Case "mauswählbar"
                            NeuScript.addEreignisLandkarteMAuswählbar(s(2))
                        Case "mnichtauswählbar"
                            NeuScript.addEreignisLandkarteSetZustand(s(2), Mission.MissionsZustände.NichtAnwählbar)
                    End Select
                End If
                If z.StartsWith("Gewonnen:") Then
                    z = z.Remove(0, 9)
                    NeuScript.addEreignisSieg(z)
                    Continue While
                End If
                If z.StartsWith("SetFeuerladung:") Then
                    z = z.Remove(0, 15)
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        NeuScript.addEreignisSetFeuerLadung(s(0), s(1), s(3), s(2))
                    Else
                        NeuScript.addEreignisSetFeuerLadung(s(0), s(1), s(2))
                    End If
                    Continue While
                End If
                If z.ToLower.StartsWith("addwarteeinheit:") Then
                    z = z.Remove(0, 16)
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        NeuScript.addEreignisAddWarteEinheit(s(0), s(1), s(3), s(2))
                    Else
                        NeuScript.addEreignisAddWarteEinheit(s(0), s(1), s(2))
                    End If
                    Continue While
                End If

                If z.ToLower.StartsWith("removeblockierteeinheit:") Then
                    z = z.Remove(0, 24)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisRemoveBlockierteEinheit(s(0), s(1))
                End If
                If z.ToLower.StartsWith("setfabrikfonds:") Then
                    z = z.Remove(0, 15)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisSetFabrikfonds(s(0), s(1), s(2))
                End If

                If z.ToLower.StartsWith("neutralergebäudeangriff:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisSetNeutralerGebäudeAngriff(s(0), s(1))
                End If

                If z.ToLower.StartsWith("increasevariable:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s() As String = z.Split("|")
                    NeuScript.adEreignisIncreaseVariable(s(1), s(2))
                End If

                If z.ToLower.StartsWith("setvariable:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisSetVariable(s(0), s(1))
                End If

                If z.ToLower.StartsWith("besiegt:") Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s() As String = z.Split("|")
                    NeuScript.addEreignisDefearPlayer(s(0))
                End If
            End While
            strR.Dispose() 'Brauchen wir nicht mehr.
        Else
            ' Console.WriteLine("Das Script: """ + Scriptname + """ konnte nicht gefunden werden.")
        End If
    End Sub

    ''' <summary>
    ''' Prüft, ob Scripte ausgeführt werden können und führt sie auch aus.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Prüfen(ByVal Prüfstadium As Prüfstadien)
        If Scripts IsNot Nothing Then
            If Scripts.Length > 0 Then
                For Each Script In Scripts
                    Script.ScriptPrüfen(Prüfstadium)
                Next
            End If
        End If
    End Sub

    Public Shared Function GetVariable(ByVal Name As String) As GebäudeFabrik.Variable
        For I = 0 To Variablen.Count - 1
            If Variablen(I).Name = Name Then
                Return Variablen(I)
            End If
        Next
        Return Nothing
    End Function
#End Region
#Region "Eine Instanz"
    Dim Bedingungen() As Bedingung = {}
    Dim Ereignisse() As Ereignis = {}
    Dim Ausgeführt As Boolean = False

    Sub New()
        Array.Resize(Scripts, Scripts.Length + 1)
        Scripts(Scripts.Length - 1) = Me
    End Sub

    ''' <summary>
    ''' Setzt die Bedingung, das das Ereignis ausgelöst wird, wenn ein bestimmter Tag anbricht
    ''' </summary>
    ''' <param name="Tag">Der wievielte Tag</param>
    ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgelöst werden soll.</param>
    ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgelöst werden soll.</param>
    ''' <remarks></remarks>
    Sub addBedingungTag(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTag(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungTagGrößer(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTagGrößer(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungTagKleiner(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTagKleiner(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungJedenXTag(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungJedenXTag(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungBesetzt(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungBesetzt(KooX, KooY, Spieler)
    End Sub
    Sub addBedingungBesetzt(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Schlachtfeld As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungBesetzt(KooX, KooY, Spieler, Schlachtfeld)
    End Sub
    Sub addBedingungSieg(ByVal Team As Char)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungSieg(Team)
    End Sub
    Sub addBedingungFeuerbereit(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerladung As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungFeuerbereit(X, Y, Schlacht, Feuerladung)
    End Sub
    Sub addBedingungNachXZügenImmer(ByVal Tage As Integer, ByVal StartTag As Integer, ByVal Prüfstadium As Prüfstadien)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungNachXZügenImmer(Tage, StartTag, Prüfstadium)
    End Sub
    Sub addBedingungLandkarteZustand(ByVal Karte As Integer, ByVal Zustand As Mission.MissionsZustände)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungLandkarteZustand(Karte, Zustand)
    End Sub
    Sub addBedingungCountLandkarteZustand(ByVal StartKarte As Integer, ByVal Endkarte As Integer, ByVal Count As Integer, ByVal Zustand As Mission.MissionsZustände)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungCountLandkarteZustand(StartKarte, Endkarte, Count, Zustand)
    End Sub
    Sub addBedingungGebäudeZerstört(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungGebäudeZerstört(X, Y, Schlacht)
    End Sub
    Sub addBedingungSpielerBesiegt(ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungSpielerBesiegt(Spieler)
    End Sub
    Sub addBedingungInBereich(ByVal P1 As Point, ByVal P2 As Point, ByVal Schlacht As Integer, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungInBereich(P1, P2, Spieler, Schlacht)
    End Sub
    Sub addBedingungEinheitZerstört(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungEinheitZerstört(X, Y, Schlacht)
    End Sub
    Sub addBedingungFeldLeer(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungFeldLeer(X, Y, Schlacht)
    End Sub
    Sub addBedingungZufall(ByVal Wahrscheinlichkeit As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungZufall(Wahrscheinlichkeit)
    End Sub
    Sub addBedingungVariableIstGleich(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableEquals(Wert, Name)
    End Sub
    Sub addBedingungVariableKleiner(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableSmaller(Wert, Name)
    End Sub
    Sub addBedingungVariableGrößer(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreater(Wert, Name)
    End Sub
    Sub addBedingungVariableGrößerGleich(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreaterEqual(Wert, Name)
    End Sub

    Sub addEreignisDialog(ByVal Text As String, ByVal KOID As String, ByVal Spieler As Integer, ByVal Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck, Optional ByVal dialogMusik As String = "", Optional ByVal dialogBild As String = "")
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisDialog(Text, KOID, Spieler, Gesichtsausdruck, dialogMusik, dialogBild)
    End Sub
    Sub addEreignisEinheitErschaffen(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisEinheitErschaffen(EinheitsID, KooX, KooY, Spieler, Leben, kannZiehen)
    End Sub
    Sub addEreignisEinheitErschaffen(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean, ByVal Schlacht As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisEinheitErschaffen(EinheitsID, KooX, KooY, Spieler, Leben, kannZiehen, Schlacht)
    End Sub
    Sub addEreignisSetKP(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer, ByVal Schlachtfeld As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKP(KooX, KooY, KP, Schlachtfeld)
    End Sub
    Sub addEreignisSetKP(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKP(KooX, KooY, KP)
    End Sub
    Sub addEreignisSetKO(ByVal Spieler As Integer, ByVal KOIndex As Integer, ByVal KOID As String)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKO(Spieler, KOIndex, KOID)
    End Sub
    Sub addEreignisSchadenswelle(ByVal Spieler As Integer, ByVal Schaden As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSchadenswelle(Spieler, Schaden)
    End Sub
    Sub addEreignisLandkarteMGewonnen(ByVal MissionsIndex As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMGewonnen(MissionsIndex)
    End Sub
    Sub addEreignisLandkarteMAuswählbar(ByVal MissionsIndex As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMAuswählbar(MissionsIndex)
    End Sub
    Sub addEreignisSieg(ByVal Team As Char)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSieg(Team)
    End Sub
    Sub addEreignisSetFeuerLadung(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerladung As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetFeuerLadung(X, Y, Schlacht, Feuerladung)
    End Sub
    Sub addEreignisAddWarteEinheit(ByVal X As Integer, ByVal Y As Integer, ByVal Spieler As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisAddWarteEinheit(X, Y, Schlacht, Spieler)
    End Sub
    Sub addEreignisRemoveBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisRemoveBlockierteEinheit(EinheitenID, Armee)
    End Sub
    Sub addEreignisLandkarteSetZustand(ByVal Index As Integer, ByVal Zustand As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteSetZustand(Index, Zustand)
    End Sub
    Sub addEreignisSetFabrikfonds(ByVal X As Integer, ByVal Y As Integer, ByVal Fonds As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetFabrikfonds(X, Y, Fonds)
    End Sub
    Sub addEreignisSetNeutralerGebäudeAngriff(ByVal Spieler As Integer, ByVal Angriff As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetNeutralerGebäudeAngriff(Spieler, Angriff)
    End Sub
    Sub addEreignisSetVariable(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetVariable(Name, Wert)
    End Sub
    Sub adEreignisIncreaseVariable(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisIncreaseVariable(Name, Wert)
    End Sub
    Sub addEreignisDefearPlayer(ByVal Spieler As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisDefearPlayer(Spieler)
    End Sub
    ''' <summary>
    ''' Prüft, ob das Ereignis ausgelöst werden kann. Wenn ja wird es gleich ausgelöst, sofern möglich ;)
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ScriptPrüfen(ByVal Prüfstadium As Prüfstadien)

        'es gibt aber Scripts die mehrmals aufgerufen werden sollen.
        If Ausgeführt Then Exit Sub 'Wenn das Script schon beendet wurde, können wir alles so lassen wie es ist.
        Dim Loslegen As Boolean = True
        If Bedingungen.Length > 0 Then
            For Each B In Bedingungen
                If Not B.Prüfen(Prüfstadium) Then Loslegen = False 'Die Frage ist, ob eine Bedingung erfüllt sein müssen oder alle, oder etwas anderes. Also im Moment, nur die letzte Bedingung zählt ist noch nicht ganz so einwandfrei, aber das kann man ja bei bedarf ändern.
            Next
        End If
        If Loslegen Then
            'Das Ereignis kann ausgeführt werden
            For Each E In Ereignisse
                E.Ausführen()
            Next
            Ausgeführt = True
            For Each B In Bedingungen
                B.ScriptAusgeführt()
                If B.MehrfachVerwendung = True Then
                    Ausgeführt = False
                End If
            Next
        End If
    End Sub


#End Region
#Region "Bedingungen"
    <Serializable()> Private MustInherit Class Bedingung
        Public MustOverride Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
        Public MustOverride Function MehrfachVerwendung() As Boolean
        ''' <summary>
        ''' Wird aufgerufen, wenn wir dieses Script ausgeführt haben
        ''' </summary>
        ''' <remarks></remarks>
        Public Overridable Sub ScriptAusgeführt()

        End Sub
    End Class
    ''' <summary>
    ''' Die Bedingung ist dieser Tag muss es sein.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungTag
        Inherits Bedingung

        Dim Tag, Spieler As Integer
        Dim Rundenanfang As Prüfstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgelöst wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgelöst werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgelöst werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Prüfstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.Rundenanfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde = Tag Then

                    Return Prüfstadium = Me.Rundenanfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfüllt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
    End Class
    ''' <summary>
    ''' Die Bedingung ist der Tag muss größer sein wie.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungTagGrößer
        Inherits Bedingung

        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Prüfstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgelöst wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgelöst werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgelöst werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Prüfstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde > Tag Then
                    Return RundenAnfang = Me.RundenAnfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfüllt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
    End Class
    ''' <summary>
    ''' Die Bedingung ist jedes vielfache des Tages.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungJedenXTag
        Inherits Bedingung

        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Prüfstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgelöst wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgelöst werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgelöst werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Prüfstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                Dim R As Integer = -1
                Math.DivRem(Objektverwalter.Spielfeld.Runde, Tag, R)
                If R = 0 Then
                    Return RundenAnfang = Me.RundenAnfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfüllt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
    End Class
    ''' <summary>
    ''' Die Bedingung ist der Tag muss kleiner sein wie.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungTagKleiner
        Inherits Bedingung

        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Prüfstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgelöst wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgelöst werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgelöst werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Prüfstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde < Tag Then
                    Return RundenAnfang = Me.RundenAnfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfüllt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
    End Class
    ''' <summary>
    ''' Die Bedingung, das ein Gebäude auf bestimmten Koordinaten einem bestimmten Spieler gehört.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungBesetzt
        Inherits Bedingung
        Dim KooX, KooY, Spieler, Schlacht As Integer

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="KooX"></param>
        ''' <param name="KooY"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Schlacht">Normalerweise 0=Bodenschlacht, denn in den Wolken sind nicht übermäßig viele Gebäude zu finden. Allerdings ist auch -1, wie bei den anderen möglich, für das Aktuelle Schlachtfeld</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, Optional ByVal Schlacht As Integer = 0)
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Spieler = Spieler
            Me.Schlacht = Schlacht
        End Sub


        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function

        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            'Naja hier spielt das Prüfstadium wohl keine große Rolle
            If Schlacht = -1 Then Schlacht = Objektverwalter.Spielfeld.MomentaneSchlacht
            If Not IsNothing(Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlacht).Gebäude) Then
                If Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlacht).Gebäude.Spieler = Spieler Then
                    Return True
                End If
            End If
            Return False
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist wir haben gewonnen
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungSieg
        Inherits Bedingung
        Dim Team As Char

        Public Sub New(ByVal Team As Char)
            Me.Team = Team
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim gewonnen As Boolean = True
            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                    If Not Objektverwalter.Spielfeld.Regeln.Besiegt(I) Then
                        gewonnen = False
                    End If
                Else
                End If
            Next

            Return gewonnen
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das Gebäude hat eine gewisse Feuerzahl
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungFeuerbereit
        Inherits Bedingung
        Dim X, Y, Feuerzahl, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Feuerzahl As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Feuerzahl = Feuerzahl
        End Sub
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerzahl As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = ObjektSpielfeld.Bodenschlacht
            Me.Feuerzahl = Feuerzahl
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Prüfstadium = Prüfstadien.RundenMitte Then
                Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude
                If Not G Is Nothing Then
                    If G.Feuerbereit = Feuerzahl Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            End If
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist wir sind N-Tage nach dem letzten ausführen.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungNachXZügenImmer
        Inherits Bedingung
        Dim Tage, LetzterTag As Integer
        Dim Prüfstadium As Prüfstadien
        Public Sub New(ByVal Tage As Integer, ByVal StartTag As Integer, ByVal Prüfstadium As Prüfstadien)
            Me.Tage = Tage
            LetzterTag = StartTag
            Me.Prüfstadium = Prüfstadium
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Me.Prüfstadium = Prüfstadium Then
                If Objektverwalter.Spielfeld.Runde >= LetzterTag + Tage Then
                    Return True
                End If
            End If
        End Function
        Public Overrides Sub ScriptAusgeführt()
            LetzterTag = Objektverwalter.Spielfeld.Runde
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist wir sind N-Tage nach dem letzten ausführen.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungLandkarteZustand
        Inherits Bedingung
        Dim Karte As Integer
        Dim Zustand As Mission.MissionsZustände
        Public Sub New(ByVal Karte As Integer, ByVal Zustand As Mission.MissionsZustände)
            Me.Karte = Karte
            Me.Zustand = Zustand
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Karte).MissionsZustand = Zustand Then
                Return True
            End If
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist von diesen Karten haben n.den Zustand
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungCountLandkarteZustand
        Inherits Bedingung
        Dim StartKarte, Endkarte, Count As Integer
        Dim Zustand As Mission.MissionsZustände
        Public Sub New(ByVal StartKarte As Integer, ByVal Endkarte As Integer, ByVal Count As Integer, ByVal Zustand As Mission.MissionsZustände)
            Me.StartKarte = StartKarte
            Me.Endkarte = Endkarte
            Me.Zustand = Zustand
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim C As Integer = 0
            For I = StartKarte To Endkarte
                If Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(I).MissionsZustand = Zustand Then
                    C += 1
                    If C >= Count Then
                        Return True
                    End If
                End If
            Next
            Return False
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das Gebäude dort muss Zerstört sein.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungGebäudeZerstört
        Inherits Bedingung
        Dim X, Y, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude
            If G Is Nothing Then
                If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Leben <= 0 Then
                    Return True
                End If
            End If
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das ein Spieler besiegt ist.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungSpielerBesiegt
        Inherits Bedingung
        Dim Spieler As Integer
        Public Sub New(ByVal Spieler As Integer)
            Me.Spieler = Spieler
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Return Objektverwalter.Spielfeld.Regeln.IstBesiegt(Spieler)
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das eine Einheit dieses Spielers in diesem Gebiet ist.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungInBereich
        Inherits Bedingung
        Dim P1, P2 As Point
        Dim Spieler As Integer
        Dim Schlacht As Integer
        Public Sub New(ByVal P1 As Point, ByVal P2 As Point, ByVal Spieler As Integer, ByVal Schlacht As Integer)
            Me.P1 = P1
            Me.P2 = P2
            Me.Spieler = Spieler
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Prüfstadium = Prüfstadien.RundenMitte Then
                Dim Startschlacht As Integer = Schlacht
                Dim Endschlacht As Integer = Schlacht
                If Schlacht < 0 Then
                    Startschlacht = 0
                    If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
                        Endschlacht = 1
                    Else
                        Endschlacht = 0
                    End If
                End If
                For I = Startschlacht To Endschlacht
                    For X = P1.X To P2.X
                        For Y = P1.Y To P2.Y
                            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                            If Not E Is Nothing Then
                                If E.Spieler = Spieler Then
                                    Return True
                                End If
                            End If
                        Next
                    Next
                Next
            End If
            Return False
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das eine Einheit dieses Spielers in diesem Gebiet ist.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungEinheitZerstört
        Inherits Bedingung
        Dim Einheit As ObjektEinheit
        Dim X, Y, Schlacht As Integer
        Dim Deaktiviert As Boolean = False
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            If Objektverwalter.Spielfeld Is Nothing Then
                Me.X = X
                Me.Y = Y
                Me.Schlacht = Schlacht
            Else
                Einheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
            End If
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Deaktiviert = False And Einheit Is Nothing Then
                Einheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                If Einheit Is Nothing Then
                    Deaktiviert = True
                Else
                    Return Prüfen
                End If
            ElseIf Deaktiviert = False Then
                Return Prüfen
            End If
        End Function
        Private Overloads Function Prüfen() As Boolean
            For Each Unit In Objektverwalter.Spielfeld.Einheiten
                If Not Unit Is Nothing Then
                    If Unit.Equals(Einheit) Then
                        Return False
                    End If
                End If
            Next
            If Not Einheit Is Nothing Then
                Einheit = Nothing
                Return True
            End If
        End Function
    End Class
    ''' <summary>
    ''' Bedingung ist das das Feld leer ist
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungFeldLeer
        Inherits Bedingung
        Dim X, Y, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) Is Nothing Then
                If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude Is Nothing Then
                    Return True
                ElseIf Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude.KP <= 0 Then
                    Return True
                End If
            End If
        End Function
    End Class
    ''' <summary>
    ''' This Condition will work at Random!
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class BedingungZufall
        Inherits Bedingung
        Dim Wahrscheinlichkeit As Integer
        Public Sub New(ByVal Wahrscheinlichkeit As Integer)
            Me.Wahrscheinlichkeit = Wahrscheinlichkeit
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            If Wahrscheinlichkeit < Zufallszahl(0, 100) Then
                Return True
            End If
        End Function
    End Class
    <Serializable()> Private Class BedingungVariableEquals
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim V As GebäudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert = VariablenWert Then
                Return True
            End If
            Return False
        End Function
    End Class
    <Serializable()> Private Class BedingungVariableSmaller
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim V As GebäudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert < VariablenWert Then
                Return True
            End If
            Return False
        End Function
    End Class
    <Serializable()> Private Class BedingungVariableGreater
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim V As GebäudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert > VariablenWert Then
                Return True
            End If
            Return False
        End Function
    End Class
    <Serializable()> Private Class BedingungVariableGreaterEqual
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Prüfen(ByVal Prüfstadium As Prüfstadien) As Boolean
            Dim V As GebäudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert >= VariablenWert Then
                Return True
            End If
            Return False
        End Function
    End Class
#End Region
#Region "Ereignisse"
    <Serializable()> Private MustInherit Class Ereignis
        Public MustOverride Sub Ausführen()
    End Class
    <Serializable()> Private Class EreignisDialog
        Inherits Ereignis
        Dim Text, KOID As String
        Dim Musik, Bild As String
        Dim Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck
        Dim Spieler As Integer
        Sub New(ByVal Text As String, ByVal KOID As String, ByVal Spieler As Integer, ByVal Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck, Optional ByVal dialogMusik As String = "", Optional ByVal dialogBild As String = "")
            Me.Text = Text
            Me.KOID = KOID
            Me.Gesichtsausdruck = Gesichtsausdruck
            Me.Spieler = Spieler
            Musik = dialogMusik
            Bild = dialogBild
        End Sub
        Public Overrides Sub Ausführen()
            If KOID.ToLower = "spieler".ToLower Then 'Der Aktuelle erste KO des Spielers soll sprechen.
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiß hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
            Else 'Ein vordefinierter KO soll sprechen.
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiß hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Im Moment wird nur Brutal eine Einheit erschaffen, egal welche Konsequenzen es nach sich zieht. Später kann man hier noch irgendein Boolean mitgeben, mit dem man vlt. auf's nächste Feld ausweicht, wenn hier schon jemand steht oder so.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class EreignisEinheitErschaffen
        Inherits Ereignis
        Dim KooX, KooY, Spieler, Leben, Schlacht As Integer
        Dim EinheitsID As String
        Dim kannZiehen As Boolean
        ''' <summary>
        ''' Setzt die Startwerte.
        ''' </summary>
        ''' <param name="EinheitsID"></param>
        ''' <param name="KooX"></param>
        ''' <param name="KooY"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Leben">0-100</param>
        ''' <param name="kannZiehen"></param>
        ''' <remarks></remarks>
        Sub New(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean)
            Me.Spieler = Spieler
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Leben = Leben
            Me.EinheitsID = EinheitsID
            Me.kannZiehen = kannZiehen
            Me.Schlacht = -1
        End Sub
        Sub New(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean, ByVal Schlacht As Integer)
            Me.Spieler = Spieler
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Leben = Leben
            Me.EinheitsID = EinheitsID
            Me.kannZiehen = kannZiehen
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Sub Ausführen()
            If Schlacht = -1 Then Schlacht = Objektverwalter.Spielfeld.MomentaneSchlacht
            Objektverwalter.Spielfeld.PlaceUnit(ObjektLadeklasse.NewEinheit(EinheitsID, Spieler, KooX, KooY, Leben, Not kannZiehen), KooX, KooY, Schlacht)
        End Sub
    End Class
    ''' <summary>
    ''' Setzt die KP einer Einheit eines Gebäudes oder einer Landschaft fest, je nach dem welche Einheit auf diesem Feld ist.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class EreignisSetKP
        Inherits Ereignis
        Dim KooX, KooY, KP, Schlachtfeld As Integer

        Sub New(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer, Optional ByVal Schlachtfeld As Integer = -1)
            Me.KooX = KooX
            Me.KooY = KooY
            Me.KP = KP
            Me.Schlachtfeld = Schlachtfeld
        End Sub
        Public Overrides Sub Ausführen()
            If Schlachtfeld = -1 Then Schlachtfeld = Objektverwalter.Spielfeld.MomentaneSchlacht
            If Not IsNothing(Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld)) Then  'Nur zur sicherheit, wenn man sich mit einem Script auf eine Position bezieht, kann man sich natürlich sicher sein, dass dort jemand ist, muss es aber nicht.
                Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld).SetKP(KP)
            ElseIf Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Leben > 0 Then
                Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).SetLeben(KP)
            Else
                Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Gebäude
                If Not G Is Nothing Then
                    If G.KP > 0 Then
                        G.KP = KP
                    End If
                End If
            End If
        End Sub
    End Class
    <Serializable()> Private Class EreignisSetKO
        Inherits Ereignis
        Dim Spieler, KOIndex As Integer
        Dim KOID As String

        Sub New(ByVal Spieler As Integer, ByVal KOIndex As Integer, ByVal KOID As String)
            Me.Spieler = Spieler
            Me.KOID = KOID
            Me.KOIndex = KOIndex
            If KOIndex < 0 Then KOIndex = 0
            If KOIndex > 1 Then KOIndex = 1
        End Sub
        Public Overrides Sub Ausführen()
            If KOID = "-" Then
                If KOIndex = 1 Then Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = Nothing
            Else
                Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = ObjektLadeklasse.NewKO(KOID, Spieler)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Lässt ein Team gewinnen.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Private Class EreignisSieg
        Inherits Ereignis
        Dim Team As Char
        Public Sub New(ByVal Team As Char)
            Me.Team = Team
        End Sub
        Public Overrides Sub Ausführen()
            For I = 0 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                    Objektverwalter.Spielfeld.Regeln.Besiegt(I) = True
                Else
                    Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False
                End If
            Next
            Objektverwalter.Spielfeld.Regeln.CheckSieg()
        End Sub
    End Class
    <Serializable()> Private Class EreignisLandkarteMGewonnen
        Inherits Ereignis
        Dim Ind As Integer

        Sub New(ByVal MissionsIndex As Integer)
            Ind = MissionsIndex
        End Sub
        Public Overrides Sub Ausführen()
            Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandGewonnen()
        End Sub
    End Class
    <Serializable()> Private Class EreignisLandkarteMAuswählbar
        Inherits Ereignis
        Dim Ind As Integer

        Sub New(ByVal MissionsIndex As Integer)
            Ind = MissionsIndex
        End Sub
        Public Overrides Sub Ausführen()
            Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandAuswählbar()
        End Sub
    End Class
    <Serializable()> Private Class EreignisSchadenswelle
        Inherits Ereignis
        Dim Spieler, Wirkung As Integer

        ''' <summary>
        ''' Lässt eine Schadenswelle wie bei Olaf, Drake, Maverik usw. entstehen
        ''' </summary>
        ''' <param name="Spieler">von welchem Spieler die Welle ausgeht, alle dessen Feinde werden beschädigt.</param>
        ''' <param name="Schaden">Wieviel Schaden gemacht wird - in Leben(1-9)</param>
        ''' <remarks></remarks>
        Sub New(ByVal Spieler As Integer, ByVal Schaden As Integer)
            Wirkung = Schaden
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausführen()
            Schadenswelle(Objektverwalter.Spielfeld.Spieler(Spieler).Team, Wirkung)
        End Sub

        Sub Schadenswelle(ByVal Team As Char, ByVal neuSchaden As Integer)
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Team Then
                                Schaden(X, Y, neuSchaden, I)
                            End If
                        End If
                    Next
                Next
            Next
        End Sub
        ''' <summary>
        ''' Fügt einer Einheit Schaden zu
        ''' </summary>
        ''' <param name="X"></param>
        ''' <param name="Y"></param>
        ''' <param name="Schaden"></param>
        ''' <remarks></remarks>
        Protected Sub Schaden(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
            Dim NeuesLeben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
            NeuesLeben *= 10
            If NeuesLeben > 100 Then
                NeuesLeben = 100
            ElseIf NeuesLeben <= 0 Then
                NeuesLeben = 1
            End If
            Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Leben = NeuesLeben
        End Sub
    End Class
    <Serializable()> Private Class EreignisSetFeuerLadung
        Inherits Ereignis
        Dim X, Y, Schlacht, Feuerladung As Integer
        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Feuerladung As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Feuerladung = Feuerladung
        End Sub
        Public Overrides Sub Ausführen()
            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebäude
            If Not G Is Nothing Then
                G.SetFeuerbereit(Feuerladung)
            End If
        End Sub
    End Class
    <Serializable()> Private Class EreignisAddWarteEinheit
        Inherits Ereignis
        Dim X, Y, Schlacht, Spieler As Integer
        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Spieler As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausführen()
            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
            If Not E Is Nothing Then
                If Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                    Objektverwalter.Spielfeld.Spieler(Spieler).AddExternGezogeneEinheit(0, 0, E, ObjektSpieler.ExternGezogeneEinheit.Befehle.WartenBisAngriff, "", ObjektSpieler.ExternGezogeneEinheit.NächsteBefehle.Entfernen)
                End If
            End If
        End Sub
    End Class
    <Serializable()> Private Class EreignisRemoveBlockierteEinheit
        Inherits Ereignis
        Dim EinheitenID, Armee As String
        Sub New(ByVal EinheitenID As String, ByVal Armee As String)
            Me.EinheitenID = EinheitenID
            Me.Armee = Armee
        End Sub
        Public Overrides Sub Ausführen()
            Objektverwalter.Spielfeld.ObjektLandkartenInfo.RemoveBlockierteEinheit(EinheitenID, Armee)
        End Sub
    End Class
    <Serializable()> Private Class EreignisLandkarteSetZustand
        Inherits Ereignis
        Dim Ind As Integer
        Dim Zustand As Mission.MissionsZustände

        Sub New(ByVal MissionsIndex As Integer, ByVal Zustand As Integer)
            Ind = MissionsIndex
            Me.Zustand = Zustand
        End Sub
        Public Overrides Sub Ausführen()
            Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).MissionsZustand = Zustand
        End Sub
    End Class
    <Serializable()> Private Class EreignisSetFabrikfonds
        Inherits Ereignis
        Dim X, Y, Fonds As Integer

        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Fonds As Integer)
            Me.X = X
            Me.Y = Y
            Me.Fonds = Fonds
        End Sub
        Public Overrides Sub Ausführen()
            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
            If Not G Is Nothing Then
                If TypeOf G Is GebäudeFabrik Then
                    Dim Fabrik As GebäudeFabrik = G
                    Fabrik.Variablen(1).Wert = Fonds - Objektverwalter.Spielfeld.Spieler(Fabrik.Spieler).Fabrikfonds
                End If
            End If
        End Sub
    End Class
    <Serializable()> Private Class EreignisSetNeutralerGebäudeAngriff
        Inherits Ereignis
        Dim Spieler As Integer
        Dim Wert As Boolean
        Sub New(ByVal Spieler As Integer, ByVal Wert As Boolean)
            Me.Spieler = Spieler
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausführen()
            If Spieler <= 0 Then
                For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                    Objektverwalter.Spielfeld.Spieler(I).NeutraleGebäudeAngriff = Wert
                Next
            ElseIf Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                Objektverwalter.Spielfeld.Spieler(Spieler).NeutraleGebäudeAngriff = Wert
            End If
        End Sub
    End Class
    <Serializable()> Private Class EreignisNewVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As Integer, ByVal Wert As Boolean)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausführen()
            Variablen.Add(New GebäudeFabrik.Variable(Name, Wert))
        End Sub
    End Class
    <Serializable()> Private Class EreignisIncreaseVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As Integer, ByVal Wert As Boolean)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausführen()
            For I = 0 To Variablen.Count - 1
                If Variablen(I).Name = Name Then
                    Dim V As GebäudeFabrik.Variable = Variablen(I)
                    V.Wert += Wert
                    Variablen(I) = V
                End If
            Next
        End Sub
    End Class
    <Serializable()> Private Class EreignisSetVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As Integer, ByVal Wert As Boolean)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausführen()
            For I = 0 To Variablen.Count - 1
                If Variablen(I).Name = Name Then
                    Dim V As GebäudeFabrik.Variable = Variablen(I)
                    V.Wert = Wert
                    Variablen(I) = V
                End If
            Next
        End Sub
    End Class
    <Serializable()> Private Class EreignisDefearPlayer
        Inherits Ereignis
        Dim Spieler As Integer
        Public Sub New(ByVal Spieler As Integer)
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausführen()
            Objektverwalter.Spielfeld.Regeln.Besiegt(Spieler) = True
            Objektverwalter.Spielfeld.Regeln.CheckSieg()
        End Sub
    End Class
#End Region

End Class
